package file1;

import java.io.*;
import java.util.Scanner;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: Administrator
 * \* Date: 2022/4/11
 * \* Time: 11:32
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
public class Demo1 {
    public static void main(String[] args) throws IOException {
        //1.输入要扫描的路径
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要扫描的路径：");
        String rootDirPath = scanner.next();
        System.out.println("请输入需要查询的关键词");
        String word = scanner.next();
        File rootDir = new File(rootDirPath);
        if(!rootDir.isDirectory()){//判断File对象代表的文件是否是一一个目录
            System.out.println("输入的路径非法");
            return;
        }
        //2.递归进行遍历
        scanDir(rootDir,word);
    }

    private static void scanDir(File rootDir, String word) throws IOException {
        //1.先列出rootDir中都有哪些内容
        File[] files = rootDir.listFiles();//返回File对象代表目录下的所有文件，以File对象表示
        if(files == null){
            return;
        }
        //2.遍历每个元素，针对普通文件和目录文件分别进行处理
        for(File f:files){
            if(f.isFile()){//判断File对象代表的文件是否是一个普通文件
                //针对文件进行内容查找
                if(containsWord(f,word)){
                    System.out.println(f.getCanonicalPath());//返回对象修饰过的绝对路径
                }
            }else if(f.isDirectory()){//判断File对象代表的文件是否是一个目录
                //针对目录进行递归
                scanDir(f,word);
            }
        }
    }

    private static boolean containsWord(File f, String word) {
        StringBuilder stringBuilder = new StringBuilder();
        //把f中的内容都读出来，放到一个StringBuilder 中
        try(Reader reader = new FileReader(f)){
            char[] buffer = new char[1024];
            while (true){
                int len = reader.read(buffer);
                if(len == -1){
                    break;
                }
                //把这一段读到的结果，放到StringBuilder中
                stringBuilder.append(buffer,0,len);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //indexOf 返回的是字串的下标，如果word在stringBuilder中不存在，则返回下标-1
        return stringBuilder.indexOf(word) != -1;
    }
}
